//~ Project: TheGenerator File: Generator.groovy Created date: Oct 21, 2011
package com.ii2d.tg.generators

import java.util.List

import org.codehaus.groovy.grails.commons.GrailsDomainClass
import org.springframework.util.Assert

/**
 * 生成器抽象类
 * @author d
 * @since Oct 26, 2011
 */
abstract class Generator {
	
	Node node
	GrailsDomainClass domainClass
	String destDir
	GeneratorFactory parentFactory
	GeneratorFactory currentFactory
	
	/**
	 * 生成方法，可返回字符串，可生成到文件（具体看该生成类的用途）
	 * @param sb - 处理的字符串
	 */
	abstract void doGenerate(StringBuffer sb)
	
	/**
	 * 初始化方法，如果需要用到
	 */
	protected void init(){
		Assert.notNull(this.getNode(), "Property [node] can not be null.")
		Assert.notNull(this.getDomainClass(), "Property [domainClass] can not be null.")
		Assert.notNull(this.getParentFactory(), "Property [parentFactory] can not be null.")
		currentFactory = new GeneratorFactory("${parentFactory.getBasePackage()}.${node.name()}")
//		this.getNode().children().each {
//			Generator g = currentFactory.newInstance(it.name(), [
//				node: node,
//				domainClass: domainClass,
//				parentFactory: currentFactory
//				])
//		}
	}
	
	/**
	 * 预生成处理
	 * @param sb - 处理的字符串
	 */
	protected void preGenerate(StringBuffer sb){}
	
	/**
	* 后期处理
	* @param sb - 处理的字符串
	*/
   protected void postGenerate(StringBuffer sb){}
   
	/**
	 * 真正执行生成的方法
	 * @return
	 */
	public String generate(){
		StringBuffer sb = new StringBuffer()
		init()
		preGenerate(sb)
		doGenerate(sb)
		postGenerate(sb)
		return sb.toString()
	}
	
	public GeneratorFactory getCurrentFactory() {
		Assert.notNull currentFactory, "currentFactory not initialed, Please call init first."
		return currentFactory
	}
	
	String toString() {
		"${this.class.getName()} - ${node}"
	}
	
	protected List getTemplateGroups() {
		
	}
}
